package middlewares

import (
	"github.com/gin-gonic/gin"
	"log"
	_const "mvip-route/const"
	"mvip-route/service/damRed/impl"
	"mvip-route/service/model"
	"mvip-route/utils"
	"net/http"
	"strings"
)

// RedirectMiddlewares 重定向中间件 <br />
// RedirectMiddlewares 带参数 但是只能带 target
func RedirectMiddlewares() gin.HandlerFunc {

	// 根域名拒绝访问
	return func(c *gin.Context) {
		request := c.Request
		clientIP := c.ClientIP()

		domain := utils.GetFullDomain(c)
		service := impl.DamRedService{}
		platForm := service.GetPlatForm(domain)

		userAgent := c.GetHeader("User-Agent")
		isWeChatBrowser := utils.Wechat(userAgent)

		path := request.RequestURI
		if path == _const.RootPath && !isWeChatBrowser {
			// 访问的是根域名 估计是有人在搞事情了；记录日志 提示404
			utils.LogAsync("访问的是根域名，有人在搞事情了", clientIP, platForm, request)
			c.AbortWithStatus(http.StatusForbidden)
			return
		}
		c.Next()
	}
}

// SldMiddlewares 二级域名中间件
func SldMiddlewares() gin.HandlerFunc {
	return func(c *gin.Context) {
		request := c.Request
		clientIP := c.ClientIP()
		domain := utils.GetFullDomain(c)
		service := impl.DamRedService{}
		platForm := service.GetPlatForm(domain)

		path := c.Request.URL.Path
		// 二级域名不存在 拒绝访问
		Sld := strings.TrimPrefix(path, _const.RootPath)
		println("子域名", Sld)
		var param = model.DamRedForm{}
		param.Sld = Sld
		param.State = _const.StateOpen

		service = impl.DamRedService{}
		ram, err := service.SelectDamRedBySLD(param)
		if err != nil {
			// 响应参数
			log.Fatal("ramRedErr: %v", err)
			// 阻止后续处理
			c.Abort()
			return
		}

		// 二级域名不存在 拒绝访问
		if ram.State == _const.StateClose || ram.Id == 0 {
			// 访问的是根域名 估计是有人在搞事情了；记录日志 提示404
			utils.LogAsync("访问不存在的sld，又在搞事情？", clientIP, platForm, request)
			c.AbortWithStatus(http.StatusForbidden)
			return
		}

		// 没有请求参数或者请求参数不是param 则拒绝访问
		query := request.URL.Query()
		reqParam := query.Get(_const.Param)
		reqIdCard := query.Get(_const.IdCard)
		if reqParam == "" && reqIdCard == "" {
			// 访问的是根域名 估计是有人在搞事情了；记录日志 提示404
			utils.LogAsync("访问存在的sld，没带参数，又在搞事情？", clientIP, platForm, request)
			c.AbortWithStatus(http.StatusForbidden)
			return
		}

		// 设置跳转类型
		c.Set(_const.RamRed, ram)
		c.Set(_const.Platform, ram)
		c.Next()
	}

}
